/**
 * 代理模式, 对象保护
 * 节省程序开销(redis访问、store访问, get, set方法, react event proxy...)
 */

interface IData {
  nm: string;
  id: number;
  [propName: string]: any;
}


/**
 * 代理类和委托类实现相同的接口, 代理类不实现真正的服务, 而是通过调用委托类的对象方法来实现
 * 而在调用对应方法的时候可以添加一些代理类的公共服务
 */
interface IMock {
  get: () => IData;
}

export class RealData implements IMock {
  // 原始数据每一次get都会获取new Date().getTime()
  get(): IData {
    return {
      nm: 'hello',
      id: new Date().getTime()
    }
  }
}

export class DataProxy implements IMock {
  dataSource = new RealData()
  proxyData: IData
  get() {
    // 代理数据设置成了单例和缓存
    if (!this.proxyData) {
      let realData = this.dataSource.get();
      this.proxyData = {
        ...realData
      }
      this.proxyData.tag = '我是代理商广告'
    }
    return this.proxyData
  }
}